#ifndef _AMERICO_VECTOR_DEFINES_H_
#define _AMERICO_VECTOR_DEFINES_H_

#include "Vector.h"

typedef Vector2<float> Vector2f;
typedef Vector3<float> Vector3f;
typedef Vector4<float> Vector4f;

typedef Vector2<int> Vector2i;
typedef Vector3<int> Vector3i;
typedef Vector4<int> Vector4i;

typedef Vector2<unsigned int> Vector2u;
typedef Vector3<unsigned int> Vector3u;
typedef Vector4<unsigned int> Vector4u;

template <typename T>
inline Vector2<T> VectorX(const Vector2<T> &aValue)
{
	return Vector2<T>(aValue.x,0);
}

template <typename T>
inline Vector2<T> VectorY(const Vector2<T> &aValue)
{
	return Vector2<T>(0, aValue.y);
}

template <typename T>
inline Vector3<T> VectorX(const Vector3<T> &aValue)
{
	return Vector3<T>(aValue.x,0, 0);
}

template <typename T>
inline Vector3<T> VectorY(const Vector3<T> &aValue)
{
	return Vector3<T>(0, aValue.y, 0);
}

template <typename T>
inline Vector3<T> VectorZ(const Vector3<T> &aValue)
{
	return Vector3<T>(0, 0, aValue.z);
}

template <typename T>
inline Vector4<T> VectorX(const Vector4<T> &aValue)
{
	return Vector4<T>(aValue.x,0, 0, 0);
}

template <typename T>
inline Vector4<T> VectorY(const Vector4<T> &aValue)
{
	return Vector4<T>(0, aValue.y, 0, 0);
}

template <typename T>
inline Vector4<T> VectorZ(const Vector4<T> &aValue)
{
	return Vector4<T>(0, 0, aValue.z, 0);
}

template <typename T>
inline Vector4<T> VectorW(const Vector4<T> &aValue)
{
	return Vector4<T>(0, 0, 0, aValue.w);
}

#endif